package cn.cycleif.component.redis;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

public interface RedisCache {

  void set(String key, Object value, long expire);

  void expire(String key, long expire, TimeUnit unit);

  /**
   * 使用默认过期时间
   */
  void set(String key, Object value);

  /**
   * 获取值(复杂类型)，并重新设置过期时间
   */
  <T> T get(String key, Class<T> clazz, long expire);

  <T> T get(String key, Class<T> clazz);

  /**
   * 如果没有值，则写入 supplier 提供的值，同时返回此值
   *
   * @param <T> 值类型
   */
  <T> T get(String key, Class<T> clazz, Supplier<T> supplier, long ttl);

  /**
   * 获取值(简单类型)，并重新设置过期时间
   */
  String get(String key, long expire);

  String get(String key);

  void delete(String key);

  void delete(List<String> keys);

  Boolean hasKey(String key);

  long getExpire(String s);

  Integer hyperLogAdd(String key, String value);

  Integer getHyperLog(String key);

  Long sAdd(String key, Object value);

  Long sRem(String key, Object value);

  Boolean sIsMember(String key, Object value);

  Set<String> sMember(String key);

  Long sSize(String key);

  void hSet(String key, String hashKey, Object value);

  Long hDel(String key, String hashKey);

  Boolean hExists(String key, String hashKey);

  Long hSize(String key);

  Set<Object> hKeys(String key);

  List<Object> hVals(String key);

  Object hGet(String key, String hashKey);

  Long hIncrBy(String key, String hashKey, long delta);
}
